JavaScript Module Federationã®ããŒãžã§ã³ç«¶åã«ã€ããŠãæ ¹æ¬åå ãšå¹æçãªè§£æ±ºæŠç¥ãæ·±æãããå ç¢ã§ã¹ã±ãŒã©ãã«ãªãã€ã¯ãããã³ããšã³ãã®æ§ç¯æ¹æ³ãæ¢ããŸãã
JavaScript Module FederationïŒããŒãžã§ã³ç«¶åã解決æŠç¥ã§ä¹ãè¶ãã
JavaScript Module Federationã¯ãç¬ç«ããŠãããã€ãããJavaScriptã¢ããªã±ãŒã·ã§ã³éã§ã³ãŒããå ±æã§ããwebpackã®åŒ·åãªæ©èœã§ããããã«ããããã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ã®äœæãå¯èœã«ãªããç°ãªãããŒã ãå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã®åã ã®éšåãææãããããã€ã§ããŸãããããããã®åæ£åã®æ§è³ªã¯ãå ±æäŸåé¢ä¿éã§ã®ããŒãžã§ã³ç«¶åã®å¯èœæ§ããããããŸãããã®èšäºã§ã¯ããããã®ç«¶åã®æ ¹æ¬åå ãæ¢ãããããã解決ããããã®å¹æçãªæŠç¥ãæäŸããŸãã
Module Federationã«ãããããŒãžã§ã³ç«¶åã®çè§£
Module Federationã®ã»ããã¢ããã§ã¯ãç°ãªãã¢ããªã±ãŒã·ã§ã³ïŒãã¹ããšãªã¢ãŒãïŒãåãã©ã€ãã©ãªïŒäŸïŒReactãLodashïŒã«äŸåããå¯èœæ§ããããŸãããããã®ã¢ããªã±ãŒã·ã§ã³ãç¬ç«ããŠéçºã»ãããã€ããããšãå ±æã©ã€ãã©ãªã®ç°ãªãããŒãžã§ã³ã䜿çšããå¯èœæ§ããããŸããããã«ããããã¹ããšãªã¢ãŒãã®ã¢ããªã±ãŒã·ã§ã³ãäºææ§ã®ãªãããŒãžã§ã³ã®åãã©ã€ãã©ãªã䜿çšããããšãããšãå®è¡æãšã©ãŒãäºæããªãåäœã«ã€ãªããå¯èœæ§ããããŸãã以äžã¯ãäžè¬çãªåå ã®å èš³ã§ãïŒ
- ç°ãªãããŒãžã§ã³èŠä»¶ïŒ åã¢ããªã±ãŒã·ã§ã³ãããã®
package.jsonãã¡ã€ã«ã§å ±æäŸåé¢ä¿ã«å¯ŸããŠç°ãªãããŒãžã§ã³ç¯å²ãæå®ããå¯èœæ§ããããŸããäŸãã°ãããã¢ããªã±ãŒã·ã§ã³ã¯react: ^16.0.0ãèŠæ±ããå¥ã®ã¢ããªã±ãŒã·ã§ã³ã¯react: ^17.0.0ãèŠæ±ããå ŽåããããŸãã - æšç§»çãªäŸåé¢ä¿ïŒ ãããã¬ãã«ã®äŸåé¢ä¿ãäžè²«ããŠããŠããæšç§»çãªäŸåé¢ä¿ïŒäŸåé¢ä¿ã®äŸåé¢ä¿ïŒãããŒãžã§ã³ç«¶åãåŒãèµ·ããå¯èœæ§ããããŸãã
- äžè²«æ§ã®ãªããã«ãããã»ã¹ïŒ ç°ãªããã«ãæ§æããã«ãããŒã«ããæçµçãªãã³ãã«ã«å«ãŸããå ±æã©ã€ãã©ãªã®ç°ãªãããŒãžã§ã³ã«ã€ãªããå¯èœæ§ããããŸãã
- éåæèªã¿èŸŒã¿ïŒ Module Federationã¯ããªã¢ãŒãã¢ãžã¥ãŒã«ã®éåæèªã¿èŸŒã¿ã䌎ãããšããããããŸãããã¹ãã¢ããªã±ãŒã·ã§ã³ãå ±æã©ã€ãã©ãªã®ç°ãªãããŒãžã§ã³ã«äŸåãããªã¢ãŒãã¢ãžã¥ãŒã«ãèªã¿èŸŒããšããªã¢ãŒãã¢ãžã¥ãŒã«ãå ±æã©ã€ãã©ãªã«ã¢ã¯ã»ã¹ããããšãããšãã«ç«¶åãçºçããå¯èœæ§ããããŸãã
ã·ããªãªäŸ
2ã€ã®ã¢ããªã±ãŒã·ã§ã³ããããšæ³åããŠãã ããïŒ
- ãã¹ãã¢ããªã±ãŒã·ã§ã³ïŒã¢ããªAïŒïŒ React ããŒãžã§ã³ 17.0.2 ã䜿çšã
- ãªã¢ãŒãã¢ããªã±ãŒã·ã§ã³ïŒã¢ããªBïŒïŒ React ããŒãžã§ã³ 16.8.0 ã䜿çšã
ã¢ããªAã¯ã¢ããªBããªã¢ãŒãã¢ãžã¥ãŒã«ãšããŠæ¶è²»ããŸããã¢ããªAããReact 16.8.0ã®æ©èœã«äŸåããã¢ããªBã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšãããšãã¢ããªAãReact 17.0.2ãå®è¡ããŠããããããšã©ãŒãäºæããªãåäœã«ééããå¯èœæ§ããããŸãã
ããŒãžã§ã³ç«¶åã解決ããããã®æŠç¥
Module Federationã«ãããããŒãžã§ã³ç«¶åã«å¯ŸåŠããããã«ãããã€ãã®æŠç¥ãæ¡çšã§ããŸããæé©ãªã¢ãããŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ãšç«¶åã®æ§è³ªã«äŸåããŸãã
1. äŸåé¢ä¿ã®æç€ºçãªå ±æ
æãåºæ¬çãªã¹ãããã¯ããã¹ããšãªã¢ãŒãã®ã¢ããªã±ãŒã·ã§ã³éã§ã©ã®äŸåé¢ä¿ãå
±æããããæç€ºçã«å®£èšããããšã§ããããã¯ããã¹ããšãªã¢ãŒãã®äž¡æ¹ã®webpackèšå®ã§sharedãªãã·ã§ã³ã䜿çšããŠè¡ããŸãã
// webpack.config.js (ãã¹ããšãªã¢ãŒã)
module.exports = {
// ... ä»ã®èšå®
plugins: [
new ModuleFederationPlugin({
// ... ä»ã®èšå®
shared: {
react: {
singleton: true,
eager: true,
requiredVersion: '^17.0.0', // ãŸãã¯ããå
·äœçãªããŒãžã§ã³ç¯å²
},
'react-dom': {
singleton: true,
eager: true,
requiredVersion: '^17.0.0',
},
// ãã®ä»ã®å
±æäŸåé¢ä¿
},
}),
],
};
sharedèšå®ãªãã·ã§ã³ã詳ããèŠãŠãããŸãããïŒ
singleton: trueïŒ ããã«ããããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§å ±æã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ã䜿çšãããããšãä¿èšŒãããŸããããã¯Reactã®ãããªã©ã€ãã©ãªã«ãšã£ãŠéåžžã«éèŠã§ãè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ããããšãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãããããtrueã«èšå®ãããšãå ±æã¢ãžã¥ãŒã«ã®ç°ãªãããŒãžã§ã³ã«äºææ§ããªãå Žåã«Module Federationããšã©ãŒãã¹ããŒããŸããeager: trueïŒ ããã©ã«ãã§ã¯ãå ±æã¢ãžã¥ãŒã«ã¯é å»¶èªã¿èŸŒã¿ãããŸããeagerãtrueã«èšå®ãããšãå ±æã¢ãžã¥ãŒã«ãå³åº§ã«èªã¿èŸŒãŸããããã«ãªããããŒãžã§ã³ç«¶åã«ããå®è¡æãšã©ãŒãé²ãã®ã«åœ¹ç«ã¡ãŸããrequiredVersion: '^17.0.0'ïŒ ããã¯ãå¿ èŠãšãããå ±æã¢ãžã¥ãŒã«ã®æå°ããŒãžã§ã³ãæå®ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³éã§ããŒãžã§ã³ã®äºææ§ã匷å¶ã§ããŸãããããã¢ããããŒããèš±å¯ããããã«ãåäžã®ããŒãžã§ã³çªå·ã§ã¯ãªããç¹å®ã®ããŒãžã§ã³ç¯å²ïŒäŸïŒ^17.0.0ã>=17.0.0 <18.0.0ïŒã䜿çšããããšã匷ããå§ãããŸããããã¯ãè€æ°ã®ããŒã ãåãäŸåé¢ä¿ã®ç°ãªããããããŒãžã§ã³ã䜿çšããå¯èœæ§ãããå€§èŠæš¡ãªçµç¹ã§ã¯ç¹ã«éèŠã§ãã
2. ã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ïŒSemVerïŒãšããŒãžã§ã³ç¯å²
ã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ïŒSemVerïŒã®ååã«åŸãããšã¯ãäŸåé¢ä¿ã广çã«ç®¡çããããã«äžå¯æ¬ ã§ããSemVerã¯3éšæ§æã®ããŒãžã§ã³çªå·ïŒMAJOR.MINOR.PATCHïŒã䜿çšããåéšåãã€ã³ã¯ãªã¡ã³ãããããã®ã«ãŒã«ãå®çŸ©ããŸãïŒ
- MAJORïŒ äºææ§ã®ãªãAPI倿Žãè¡ã£ãå Žåã«ã€ã³ã¯ãªã¡ã³ãããŸãã
- MINORïŒ åŸæ¹äºææ§ã®ããæ¹æ³ã§æ©èœã远å ããå Žåã«ã€ã³ã¯ãªã¡ã³ãããŸãã
- PATCHïŒ åŸæ¹äºææ§ã®ãããã°ä¿®æ£ãè¡ã£ãå Žåã«ã€ã³ã¯ãªã¡ã³ãããŸãã
package.jsonãã¡ã€ã«ãsharedèšå®ã§ããŒãžã§ã³èŠä»¶ãæå®ããéã¯ãããŒãžã§ã³ç¯å²ïŒäŸïŒ^17.0.0, >=17.0.0 <18.0.0, ~17.0.2ïŒã䜿çšããŠãç Žå£çãªå€æŽãé¿ãã€ã€äºææ§ã®ããæŽæ°ãèš±å¯ããŸãã以äžã¯ãäžè¬çãªããŒãžã§ã³ç¯å²æŒç®åã®ç°¡åãªãªãã€ã³ããŒã§ãïŒ
^ïŒãã£ã¬ããïŒïŒ 巊端ã®ãŒãã§ãªãæ°å€ã倿ŽããªãæŽæ°ãèš±å¯ããŸããäŸãã°ã^1.2.3ã¯ããŒãžã§ã³1.2.4ã1.3.0ãèš±å¯ããŸããã2.0.0ã¯èš±å¯ããŸããã^0.2.3ã¯ããŒãžã§ã³0.2.4ãèš±å¯ããŸããã0.3.0ã¯èš±å¯ããŸããã~ïŒãã«ãïŒïŒ ãããæŽæ°ãèš±å¯ããŸããäŸãã°ã~1.2.3ã¯ããŒãžã§ã³1.2.4ãèš±å¯ããŸããã1.3.0ã¯èš±å¯ããŸããã>=ïŒ ä»¥äžã<=ïŒ ä»¥äžã>ïŒ ãã倧ããã<ïŒ ããå°ããã=ïŒ çããã*ïŒ ä»»æã®ããŒãžã§ã³ãæ¬çªç°å¢ã§ã¯äºæž¬äžèœãªåäœã«ã€ãªããå¯èœæ§ãããããã*ã®äœ¿çšã¯é¿ããŠãã ããã
3. äŸåé¢ä¿ã®éè€æé€
npm dedupeãyarn dedupeã®ãããªããŒã«ã¯ãnode_modulesãã£ã¬ã¯ããªå
ã®éè€ããäŸåé¢ä¿ãç¹å®ããåé€ããã®ã«åœ¹ç«ã¡ãŸããããã«ãããåäŸåé¢ä¿ã®ããŒãžã§ã³ã1ã€ã ãã€ã³ã¹ããŒã«ãããããã«ããããšã§ãããŒãžã§ã³ç«¶åã®å¯èœæ§ãæžããããšãã§ããŸãã
ãããžã§ã¯ããã£ã¬ã¯ããªã§ãããã®ã³ãã³ããå®è¡ããŠãã ããïŒ
npm dedupe
yarn dedupe
4. Module Federationã®é«åºŠãªå ±æèšå®ã®æŽ»çš
Module Federationã¯ãå ±æäŸåé¢ä¿ãèšå®ããããã®ããé«åºŠãªãªãã·ã§ã³ãæäŸããŸãããããã®ãªãã·ã§ã³ã«ãããäŸåé¢ä¿ãã©ã®ããã«å ±æããã解決ããããã埮調æŽã§ããŸãã
versionïŒ å ±æã¢ãžã¥ãŒã«ã®æ£ç¢ºãªããŒãžã§ã³ãæå®ããŸããimportïŒ å ±æããã¢ãžã¥ãŒã«ãžã®ãã¹ãæå®ããŸããshareKeyïŒ ã¢ãžã¥ãŒã«ãå ±æããããã«ç°ãªãããŒã䜿çšã§ããŸããããã¯ãåãã¢ãžã¥ãŒã«ã®è€æ°ã®ããŒãžã§ã³ãç°ãªãååã§å ±æããå¿ èŠãããå Žåã«äŸ¿å©ã§ããshareScopeïŒ ã¢ãžã¥ãŒã«ãå ±æããã¹ã³ãŒããæå®ããŸããstrictVersionïŒ trueã«èšå®ãããšãå ±æã¢ãžã¥ãŒã«ã®ããŒãžã§ã³ãæå®ãããããŒãžã§ã³ãšå®å šã«äžèŽããªãå Žåã«Module Federationããšã©ãŒãã¹ããŒããŸãã
shareKeyãšimportãªãã·ã§ã³ã䜿çšããäŸã§ãïŒ
// webpack.config.js (ãã¹ããšãªã¢ãŒã)
module.exports = {
// ... ä»ã®èšå®
plugins: [
new ModuleFederationPlugin({
// ... ä»ã®èšå®
shared: {
react16: {
import: 'react',
shareKey: 'react',
singleton: true,
requiredVersion: '^16.0.0',
},
react17: {
import: 'react',
shareKey: 'react',
singleton: true,
requiredVersion: '^17.0.0',
},
},
}),
],
};
ãã®äŸã§ã¯ãReact 16ãšReact 17ã®äž¡æ¹ãåãshareKeyïŒ'react'ïŒã§å
±æãããŸããããã«ããããã¹ããšãªã¢ãŒãã®ã¢ããªã±ãŒã·ã§ã³ã¯ç«¶åãåŒãèµ·ããããšãªãç°ãªãããŒãžã§ã³ã®Reactã䜿çšã§ããŸãããã ãããã®ã¢ãããŒãã¯ãã³ãã«ãµã€ãºãå¢å ããç°ãªãReactããŒãžã§ã³ãæ¬åœã«äºææ§ããªãå Žåã«ã©ã³ã¿ã€ã ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããããæ³šæããŠäœ¿çšããå¿
èŠããããŸããéåžžã¯ããã¹ãŠã®ãã€ã¯ãããã³ããšã³ãã§åäžã®ReactããŒãžã§ã³ã«æšæºåããæ¹ãè¯ãã§ãã
5. äžå åãããäŸåé¢ä¿ç®¡çã·ã¹ãã ã®äœ¿çš
ãã€ã¯ãããã³ããšã³ãã«åãçµãè€æ°ã®ããŒã ãæã€å€§èŠæš¡ãªçµç¹ã§ã¯ãäžå
åãããäŸåé¢ä¿ç®¡çã·ã¹ãã ãéåžžã«äŸ¡å€ããããŸãããã®ã·ã¹ãã ã䜿çšããŠãå
±æäŸåé¢ä¿ã®äžè²«ããããŒãžã§ã³èŠä»¶ãå®çŸ©ãã匷å¶ããããšãã§ããŸããpnpmïŒå
±ænode_modulesæŠç¥ãæã€ïŒãã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ã®ãããªããŒã«ã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãå
±æã©ã€ãã©ãªã®äºææ§ã®ããããŒãžã§ã³ã䜿çšããããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒpnpm
pnpmã¯ãããã±ãŒãžãä¿åããããã«ã³ã³ãã³ãã¢ãã¬ã¹å¯èœãªãã¡ã€ã«ã·ã¹ãã ã䜿çšããŸããããã±ãŒãžãã€ã³ã¹ããŒã«ãããšãpnpmã¯ãã®ã¹ãã¢å ã®ããã±ãŒãžãžã®ããŒããªã³ã¯ãäœæããŸããããã¯ãè€æ°ã®ãããžã§ã¯ãããã¡ã€ã«ãè€è£œããããšãªãåãããã±ãŒãžãå ±æã§ããããšãæå³ããŸããããã«ããããã£ã¹ã¯ã¹ããŒã¹ãç¯çŽããã€ã³ã¹ããŒã«é床ãåäžãããããšãã§ããŸããããã«éèŠãªããšã«ããããžã§ã¯ãéã®äžè²«æ§ã確ä¿ããã®ã«åœ¹ç«ã¡ãŸãã
pnpmã§äžè²«ããããŒãžã§ã³ã匷å¶ããã«ã¯ãpnpmfile.jsãã¡ã€ã«ã䜿çšã§ããŸãããã®ãã¡ã€ã«ã䜿çšãããšããããžã§ã¯ãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããåã«å€æŽããããšãã§ããŸããäŸãã°ãå
±æäŸåé¢ä¿ã®ããŒãžã§ã³ãäžæžãããŠããã¹ãŠã®ãããžã§ã¯ããåãããŒãžã§ã³ã䜿çšããããã«ããããšãã§ããŸãã
// pnpmfile.js
module.exports = {
hooks: {
readPackage(pkg) {
if (pkg.dependencies && pkg.dependencies.react) {
pkg.dependencies.react = '^17.0.0';
}
if (pkg.devDependencies && pkg.devDependencies.react) {
pkg.devDependencies.react = '^17.0.0';
}
return pkg;
},
},
};
6. ã©ã³ã¿ã€ã ããŒãžã§ã³ãã§ãã¯ãšãã©ãŒã«ããã¯
å Žåã«ãã£ãŠã¯ããã«ãæã«ããŒãžã§ã³ç«¶åãå®å šã«æé€ããããšãäžå¯èœãªå ŽåããããŸãããã®ãããªç¶æ³ã§ã¯ãã©ã³ã¿ã€ã ããŒãžã§ã³ãã§ãã¯ãšãã©ãŒã«ããã¯ãå®è£ ã§ããŸããããã«ã¯ãå®è¡æã«å ±æã©ã€ãã©ãªã®ããŒãžã§ã³ã確èªããããŒãžã§ã³ã«äºææ§ããªãå Žåã«ä»£æ¿ã®ã³ãŒããã¹ãæäŸããããšãå«ãŸããŸããããã¯è€éã§ãªãŒããŒãããã远å ããŸãããç¹å®ã®ã·ããªãªã§ã¯å¿ èŠãªæŠç¥ãšãªãããšããããŸãã
// äŸïŒã©ã³ã¿ã€ã ããŒãžã§ã³ãã§ãã¯
import React from 'react';
function MyComponent() {
if (React.version && React.version.startsWith('16')) {
// React 16 åºæã®ã³ãŒãã䜿çš
return <div>React 16 Component</div>;
} else if (React.version && React.version.startsWith('17')) {
// React 17 åºæã®ã³ãŒãã䜿çš
return <div>React 17 Component</div>;
} else {
// ãã©ãŒã«ããã¯ãæäŸ
return <div>Unsupported React version</div>;
}
}
export default MyComponent;
éèŠãªèæ ®äºé ïŒ
- ããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒ ã©ã³ã¿ã€ã ãã§ãã¯ã¯ãªãŒããŒãããã远å ããŸããæ§ããã«äœ¿çšããŠãã ããã
- è€éãïŒ è€æ°ã®ã³ãŒããã¹ã管çãããšãã³ãŒãã®è€éããšã¡ã³ããã³ã¹ã®è² æ ãå¢å ããå¯èœæ§ããããŸãã
- ãã¹ãïŒ ãã¹ãŠã®ã³ãŒããã¹ã培åºçã«ãã¹ãããŠãã¢ããªã±ãŒã·ã§ã³ãå ±æã©ã€ãã©ãªã®ç°ãªãããŒãžã§ã³ã§æ£ããåäœããããšã確èªããŠãã ããã
7. ãã¹ããšç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³
å æ¬çãªãã¹ãã¯ãããŒãžã§ã³ç«¶åãç¹å®ãã解決ããããã«äžå¯æ¬ ã§ãããã¹ããšãªã¢ãŒãã®ã¢ããªã±ãŒã·ã§ã³éã®çžäºäœçšãã·ãã¥ã¬ãŒãããçµ±åãã¹ããå®è£ ããŸãããããã®ãã¹ãã¯ãå ±æã©ã€ãã©ãªã®ç°ãªãããŒãžã§ã³ãå«ããããŸããŸãªã·ããªãªãã«ããŒããå¿ èŠããããŸããå ç¢ãªç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã·ã¹ãã ã¯ãã³ãŒãã«å€æŽãå ãããããã³ã«ãããã®ãã¹ããèªåçã«å®è¡ããå¿ èŠããããŸããããã«ãããéçºããã»ã¹ã®æ©ã段éã§ããŒãžã§ã³ç«¶åãæããããšãã§ããŸãã
CIãã€ãã©ã€ã³ã®ãã¹ããã©ã¯ãã£ã¹ïŒ
- ç°ãªãäŸåé¢ä¿ããŒãžã§ã³ã§ãã¹ããå®è¡ïŒ å ±æäŸåé¢ä¿ã®ç°ãªãããŒãžã§ã³ã§ãã¹ããå®è¡ããããã«CIãã€ãã©ã€ã³ãèšå®ããŸããããã«ãããæ¬çªç°å¢ã«å°éããåã«äºææ§ã®åé¡ãç¹å®ã§ããŸãã
- èªååãããäŸåé¢ä¿ã®æŽæ°ïŒ RenovateãDependabotãªã©ã®ããŒã«ã䜿çšããŠãäŸåé¢ä¿ãèªåçã«æŽæ°ãããã«ãªã¯ãšã¹ããäœæããŸããããã«ãããäŸåé¢ä¿ãææ°ã®ç¶æ ã«ä¿ã¡ãããŒãžã§ã³ç«¶åãåé¿ã§ããŸãã
- éçè§£æïŒ éçè§£æããŒã«ã䜿çšããŠãã³ãŒãå ã®æœåšçãªããŒãžã§ã³ç«¶åãç¹å®ããŸãã
å®äžçã®äŸãšãã¹ããã©ã¯ãã£ã¹
ãããã®æŠç¥ãã©ã®ããã«é©çšãããããããã€ãã®å®äžçã®äŸãèããŠã¿ãŸãããïŒ
- ã·ããªãª1ïŒå€§èŠæš¡Eã³ããŒã¹ãã©ãããã©ãŒã
å€§èŠæš¡ãªEã³ããŒã¹ãã©ãããã©ãŒã ã¯ãModule Federationã䜿çšããŠã¹ãã¢ããã³ããæ§ç¯ããŠããŸããç°ãªãããŒã ããååäžèЧããŒãžãã·ã§ããã³ã°ã«ãŒãããã§ãã¯ã¢ãŠãããŒãžãªã©ãã¹ãã¢ããã³ãã®ç°ãªãéšåãææããŠããŸããããŒãžã§ã³ç«¶åãé¿ããããããã©ãããã©ãŒã ã¯pnpmã«åºã¥ããäžå åãããäŸåé¢ä¿ç®¡çã·ã¹ãã ã䜿çšããŠããŸãã
pnpmfile.jsãã¡ã€ã«ã䜿çšããŠããã¹ãŠã®ãã€ã¯ãããã³ããšã³ãã§å ±æäŸåé¢ä¿ã®äžè²«ããããŒãžã§ã³ã匷å¶ããŸãããŸãããã©ãããã©ãŒã ã«ã¯ãç°ãªããã€ã¯ãããã³ããšã³ãéã®çžäºäœçšãã·ãã¥ã¬ãŒãããçµ±åãã¹ããå«ãå æ¬çãªãã¹ãã¹ã€ãŒãããããŸããDependabotã«ããèªååãããäŸåé¢ä¿ã®æŽæ°ããäŸåé¢ä¿ã®ããŒãžã§ã³ãç©æ¥µçã«ç®¡çããããã«äœ¿çšãããŠããŸãã - ã·ããªãª2ïŒéèãµãŒãã¹ã¢ããªã±ãŒã·ã§ã³
éèãµãŒãã¹ã¢ããªã±ãŒã·ã§ã³ã¯ãModule Federationã䜿çšããŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããŠããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ã«ãŠã³ãæŠèŠããŒãžãååŒå±¥æŽããŒãžãæè³ããŒããã©ãªãªããŒãžãªã©ãããã€ãã®ãã€ã¯ãããã³ããšã³ãã§æ§æãããŠããŸããå³ããèŠå¶èŠä»¶ã®ãããã¢ããªã±ãŒã·ã§ã³ã¯äžéšã®äŸåé¢ä¿ã®å€ãããŒãžã§ã³ããµããŒãããå¿ èŠããããŸããããã«å¯ŸåŠãããããã¢ããªã±ãŒã·ã§ã³ã¯ã©ã³ã¿ã€ã ããŒãžã§ã³ãã§ãã¯ãšãã©ãŒã«ããã¯ã䜿çšããŠããŸãããŸããã¢ããªã±ãŒã·ã§ã³ã«ã¯ãç°ãªããã©ãŠã¶ãããã€ã¹ã§ã®æåãã¹ããå«ã峿 Œãªãã¹ãããã»ã¹ããããŸãã
- ã·ããªãª3ïŒã°ããŒãã«ã³ã©ãã¬ãŒã·ã§ã³ãã©ãããã©ãŒã
åç±³ããšãŒããããã¢ãžã¢ã®ãªãã£ã¹ã§äœ¿çšãããŠããã°ããŒãã«ã³ã©ãã¬ãŒã·ã§ã³ãã©ãããã©ãŒã ã¯ãModule Federationã䜿çšããŠããŸããã³ã¢ãã©ãããã©ãŒã ããŒã ã¯ãããã¯ãããããŒãžã§ã³ãæã€å³æ Œãªå ±æäŸåé¢ä¿ã®ã»ãããå®çŸ©ããŸãããªã¢ãŒãã¢ãžã¥ãŒã«ãéçºããåã ã®æ©èœããŒã ã¯ããããã®å ±æäŸåé¢ä¿ã®ããŒãžã§ã³ã«åŸãå¿ èŠããããŸãããã«ãããã»ã¹ã¯ããã¹ãŠã®ããŒã ã§äžè²«ãããã«ãç°å¢ã確ä¿ããããã«Dockerã³ã³ããã䜿çšããŠæšæºåãããŠããŸããCI/CDãã€ãã©ã€ã³ã«ã¯ãç°ãªãå°åã®éçºç°å¢ããçããå¯èœæ§ã®ããããŒãžã§ã³ç«¶åãäºææ§ã®åé¡ãæããããã«ãããŸããŸãªãã©ãŠã¶ããŒãžã§ã³ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«å¯ŸããŠå®è¡ãããåºç¯ãªçµ±åãã¹ããå«ãŸããŠããŸãã
çµè«
JavaScript Module Federationã¯ãã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœãªãã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ãæ§ç¯ããããã®åŒ·åãªæ¹æ³ãæäŸããŸããããããå ±æäŸåé¢ä¿éã®ããŒãžã§ã³ç«¶åã®å¯èœæ§ã«å¯ŸåŠããããšãäžå¯æ¬ ã§ããäŸåé¢ä¿ãæç€ºçã«å ±æããã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ã«åŸããäŸåé¢ä¿ã®éè€æé€ããŒã«ã䜿çšããModule Federationã®é«åºŠãªå ±æèšå®ã掻çšããå ç¢ãªãã¹ããšç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®å®è·µãå®è£ ããããšã§ãããŒãžã§ã³ç«¶åã广çã«ä¹ãè¶ããå埩åã®ããå ç¢ãªãã€ã¯ãããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããçµç¹ã®èŠæš¡ãè€éããããã³ç¹å®ã®ããŒãºã«æãé©ããæŠç¥ãéžæããããšãå¿ããªãã§ãã ãããModule Federationã®å©ç¹ãããŸã掻çšããããã«ã¯ãäŸåé¢ä¿ç®¡çã«å¯Ÿããç©æ¥µçã§æç¢ºã«å®çŸ©ãããã¢ãããŒããäžå¯æ¬ ã§ãã